///////////////////////////////////////////////////////////////////////////////////////////////////
//
// PROJECT : Arirang family
//
// DATE    : 2008.10.23
//
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// FILE  : SHA3api_OP32.h
//
// NOTES : Optimized code of Arirang family
//
//         Based on 32-bit platform (with four 32-bit S-box and sixteen 32-bit S-box version)
//
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __SHA3API_OP32_H__
#define __SHA3API_OP32_H__ 100

///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Error

typedef enum {SUCCESS = 0, FAIL = 1, BAD_HASHLEN = 2} HashReturn;

///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Definition

#define ARIRANG224_BLOCK_LEN	64
#define ARIRANG224_DIGEST_LEN	28

#define ARIRANG256_BLOCK_LEN	64
#define ARIRANG256_DIGEST_LEN	32

#define ARIRANG384_BLOCK_LEN	128
#define ARIRANG384_DIGEST_LEN	48

#define ARIRANG512_BLOCK_LEN	128
#define ARIRANG512_DIGEST_LEN	64


///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Datatype

typedef unsigned char BYTE;				//  8-bit data type

typedef unsigned char BitSequence;		//  8-bit data type

typedef unsigned short int WORD;		// 16-bit data type

typedef unsigned int DWORD;				// 32-bit data type

typedef unsigned long DataLength;	    // 32-bit data type


///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Structure

typedef struct {

	// Hash length
	int hashbitlen;

	// Counter
	DWORD counter[4];

	// Count
	DWORD count[4];

	// Message block
	BYTE block[ARIRANG512_BLOCK_LEN];

	// Working variables
	DWORD workingvar[16];

	// hash block length
	DWORD blocklen;

	// bit_length % 7
	DWORD remainderbit;


} hashState;
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Function

HashReturn Init(hashState *state, int hashbitlen);
HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen);
HashReturn Final(hashState *state, BYTE *hashval);
HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval);
#endif
